package demo04;

import java.util.Calendar;
import java.util.Date;

/*
 *  Calendar类的成员方法：
 *      public int get(int field)：返回给定日历字段的值
 *      public void set(int field, int value)：将给定的日历字段设置为给定值
 *      public abstract void add(int field, int amount)：根据日历的规则，为给定的日历字段添加或减去指定的时间量
 *      public Date getTime()：返回一个表示此Calendar时间值（从历元到现在的毫秒偏移量）的Date对象
 *      public final void setTime(Date date)：使用给定的 Date 设置此 Calendar 的时间
 *  成员方法的参数：
 *      int field：日历类的字段，可以使用Calendar类的静态成员变量获取
 *          public static final int YEAR = 1;       年
 *          public static final int MONTH = 2;      月
 *          public static final int DATE = 5;       月中的某一天
 *          public static final int DAY_OF_MONTH = 5;   月中的某一天
 *          public static final int HOUR = 10;      时
 *          public static final int MINUTE = 12;    分
 *          public static final int SECOND = 13;    秒
 */
public class Demo02Calendar {
    public static void main(String[] args) {
        demo01();
        demo02();
        demo03();
        demo04();
        demo05();
    }

    /*
     * public final void setTime(Date date)：使用给定的 Date 设置此 Calendar 的时间
     * 把日期Date对象，转换为日历Calendar对象，需要先getInstance创建calendar对象，再让该对象调用此方法，使该对象更新
     */
    private static void demo05() {
        Date date = new Date(888888888888L);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date); // 设置日历对象对应的时间为毫秒值888888888888
        System.out.println(calendar); // java.util.GregorianCalendar[time=888888888888,areFieldsSet=true,...]
    }

    /*
     *  public Date getTime()：返回一个表示此Calendar时间值（从历元到现在的毫秒偏移量）的Date对象
     *  把日历Calendar对象，转换为日期Date对象
     */
    private static void demo04() {
        Calendar calendar = Calendar.getInstance();
        Date date = calendar.getTime();
        System.out.println(date); // Mon Jul 25 13:02:56 CST 2022
    }

    /*
     *  public abstract void add(int field, int amount)：根据日历的规则，为给定的日历字段添加或减去指定的时间量
     *  使指定的字段增加/减少指定的值
     *  参数：
     *      int field：传递指定的日历字段(YEAR, MONTH...)
     *      int amount：增加/减少的值
     *          正数：增加
     *          负数：减少
     */
    private static void demo03() {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.YEAR, 2);
        System.out.println(calendar.get(Calendar.YEAR)); // 2024，2022+2
        calendar.add(Calendar.MONTH, -3);
        System.out.println(calendar.get(Calendar.MONTH)); // 3，6-3
    }

    /*
     *  public void set(int field, int value)：将给定的日历字段设置为给定值
     *  参数：
     *      int field：传递指定的日历字段(YEAR, MONTH...)
     *      int value：传递字段设置的具体的值
     */
    private static void demo02() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, 8888); // 设置年为8888
        calendar.set(Calendar.MONTH, 8); // 设置月为8
        calendar.set(Calendar.DATE, 8); // 设置日为8
        System.out.println(calendar.get(Calendar.YEAR)); // 8888
        System.out.println(calendar.get(Calendar.MONTH)); // 8
        System.out.println(calendar.get(Calendar.DATE)); // 8

        // 同时设置年月日，可以使用set的重载方法
        calendar.set(9999, 9, 9);
        System.out.println(calendar.get(Calendar.YEAR)); // 9999
        System.out.println(calendar.get(Calendar.MONTH)); // 9
        System.out.println(calendar.get(Calendar.DATE)); // 9
    }

    /*
     *  public int get(int field)：返回给定日历字段的值
     *  参数：传递指定的日历字段(YEAR, MONTH...)
     *  返回值：日历字段代表的具体值
     */
    private static void demo01() {
        Calendar calendar = Calendar.getInstance(); // 获取calendar对象
        System.out.println(calendar.get(Calendar.YEAR)); // 2022，年
        System.out.println(calendar.get(Calendar.MONTH) + 1); // 7，月，西方月份为0-11月，因此转换为东方月份需要手动+1
        System.out.println(calendar.get(Calendar.DATE)); // 25，月中某一天
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); // 25，月中某一天，DAY_OF_MONTH与DATE字段效果相同
        System.out.println(calendar.get(Calendar.HOUR)); // 0，时
        System.out.println(calendar.get(Calendar.MINUTE)); // 28，分
        System.out.println(calendar.get(Calendar.SECOND)); // 43，秒
    }
}
